﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HerGoS.Administration.Entities;
using HerGoS.Interfaces;
using HerGoS.DAO;
using System.Data;
using HerGoS.Administration.Exceptions;
using HerGoS.Administration.Engine;

namespace HerGoS.Administration.Engine
{
    public class GestorContacto
    {
        /// <summary>
        /// Permite obtener el Contacto segun su identificador
        /// </summary>
        /// <param name="oid">Identificador</param>
        /// <returns>Contacto</returns>
        public static Contacto Obtener(int oid)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
                repo.Nombre = "CONTACTOS_SP";
                repo.AddParameter("@ACCION", "BYID");
                repo.AddParameter("@ID", oid);
                DataTable dt = repo.ExecuteDataTable();
                Contacto result = dt.ToGenericList<Contacto>(ContactoConverter).FirstOrDefault();
                return result;
            }
            catch (Exception ex)
            {
                throw new ContactoGetException(ex);
            }
        }

        /// <summary>
        /// Guarda un contacto relacionado a una entidad
        /// </summary>
        /// <param name="contacto">Contacto</param>
        /// <param name="entidad">Entidad</param>
        public static void Guardar(Contacto contacto, IContactos entidad)
        {
            try
            {
                IRepository repo = RepositoryFactory.CreateTransactional(Config.RepositoryName);
                repo.Nombre = "CONTACTOS_PROC";
                repo.AddParameter("@ACCION", contacto.Persistencia);
                repo.AddParameter("@ID", contacto.OID);
                repo.AddParameter("@ENTIDAD", (entidad!=null)?entidad.GetType().Name:null);
                repo.AddParameter("@IDREGISTRO", (entidad != null) ? entidad.OID : 0);
                repo.AddParameter("@IDTIPOCONTACTO", contacto.TipoContacto.OID);
                repo.AddParameter("@EMAIL", contacto.Email);
                repo.AddParameter("@TELEFONO", contacto.Telefono);
                repo.AddParameter("@FAX", contacto.Fax);
                repo.AddParameter("@PRINCIPAL", contacto.Principal);
                repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
                contacto.OID = repo.ExecuteReturnValue().ToInteger();
                repo.Commit();

                //GestorBitacora.Guardar(contacto);
            }
            catch (Exception ex)
            {
                throw new ContactoSaveException(ex);
            }
        }

        /// <summary>
        /// Guarda una lista de contacto relacionada a una entidad
        /// </summary>
        /// <param name="contactos">Lista de contactos</param>
        /// <param name="entidad">Entidad</param>
        public static void Guardar(List<Contacto> contactos, IContactos entidad)
        {
            //foreach (Contacto c in contactos)
            //{
            //    Guardar(c, entidad);
            //}

            contactos.ForEach(x=>Guardar(x,entidad));
        }

      

        /// <summary>
        /// Guarda una lista de contacto relacionada a una entidad que implementa IContactos
        /// </summary>
        /// <param name="contactos">Lista de contactos</param>
        /// <param name="entidad">Entidad</param>
        public static void Guardar(IContactos entidad)
        {
            foreach (Contacto c in entidad.Contactos)
            {
                Guardar(c, entidad);
            }
        }

        /// <summary>
        /// Elimina un contacto
        /// </summary>
        /// <param name="contacto">Contacto</param>
        public static void Eliminar(Contacto contacto)
        {
            contacto.Persistencia = EstadoPersistencia.DELETE;
            Guardar(contacto, null);
        }

        /// <summary>
        /// Permite consultar los contactos de una entidad
        /// </summary>
        /// <param name="entidad">Entidad consultada</param>
        /// <returns>Todos los contactos de la entidad</returns>
        public static List<Contacto> Consultar(IContactos entidad)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
                repo.Nombre = "CONTACTOS_SP";
                repo.AddParameter("@ACCION", "CONSULTA");
                repo.AddParameter("@ID", null);
                repo.AddParameter("@ENTIDAD", entidad.GetType().Name);
                repo.AddParameter("@IDREGISTRO", entidad.OID);
                DataTable dt = repo.ExecuteDataTable();
                List<Contacto> result = dt.ToGenericList<Contacto>(ContactoConverter);
                return result;
            }
            catch (Exception ex)
            {
                throw new ContactoGetException(ex);
            }
        }

        public static List<Contacto> Activos(IContactos entidad)
        {
            try
            {
                return entidad.Contactos.Where(x => x.Persistencia != EstadoPersistencia.DELETE).ToList();
            }
            catch (Exception ex)
            {
                throw new ContactoGetException(ex);
            }
        }

        #region Converter
        public static Contacto ContactoConverter(DataRow row)
        {
            return new Contacto
            {
                OID = row["conID"].ToInteger(),
                Email = row["conEMAIL"].ToString(),
                Telefono = row["conTELEFONO"].ToString(),
                Fax = row["conFAX"].ToString(),
                Principal = row["conPRINCIPAL"].ToBoolean(),
                TipoContacto = GestorTipoContacto.Obtener(row["conIDTIPOCONTACTO"].ToInteger()),
                Persistencia = EstadoPersistencia.UPDATE
            };
        }
        #endregion
    }
}
